﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace Supermarket
{
    class DBHelper
    {
        //数据库连接语句
        public static string conString = "server=.;database=XLSupermarket;Integrated Security=True;";
        //数据库连接
        public static SqlConnection con = new SqlConnection(conString);


        /// <summary>
        /// 连接初始化
        /// </summary>
        public static void Init()
        {
            //判断是否连接状态为中断，中断则关闭
            if (con.State == ConnectionState.Broken) con.Close();
            //判断连接状态是否为关闭，关闭则打开
            if (con.State == ConnectionState.Closed) con.Open();
        }

        public static void Close() {
            if (con.State == ConnectionState.Open) con.Close();
            if (con.State == ConnectionState.Broken) con.Close();
        }


        /// <summary>
        /// 断开式连接查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static DataTable FillData(string sql)
        {
            //状态初始化
            Init();
            //连数据库，将数据赋值于sda
            SqlDataAdapter sda = new SqlDataAdapter(sql, con);
            //声明变量dt用于存放数据
            DataTable dt = new DataTable();
            //将sda中的数据存入dt
            sda.Fill(dt);
            //关闭数据库连接
            con.Close();
            //返回所取到的数据
            return dt;
        }


        /// <summary>
        /// 非断开式连接查询
        /// </summary>
        /// <param name="sql">查询的sql语句</param>
        /// <returns>数据表</returns>
        public static SqlDataReader Readers(string sql) {
            //连接状态初始化
            Init();
            //连接数据库
            SqlCommand sc = new SqlCommand(sql, con);
            //在已经连接的状态下将数据读入SqlDataReader，并且在读取完成后自动关闭数据库的连接
            SqlDataReader sda = sc.ExecuteReader(CommandBehavior.CloseConnection);
            //返回所读取到的数据
            return sda;
        }


        /// <summary>
        /// 增删改函数
        /// </summary>
        /// <param name="sql">增删改sql语句</param>
        /// <returns>受影响的行数</returns>
        public static int Edit(string sql) {
            //连接状态初始化
            Init();
            //连接数据库
            SqlCommand sc = new SqlCommand(sql, con);
            //声明变量用于接受受影响的函数
            int num = sc.ExecuteNonQuery();
            //关闭数据库的连接
            con.Close();
            //返回受影响的函数，整形
            return num;
        }


        /// <summary>
        /// 聚合函数查询
        /// </summary>
        /// <param name="sql">sql聚合函数查询语句</param>
        /// <returns>首行首列的值</returns>
        public static Object Scal(string sql) {
            //连接状态初始化
            Init();
            //连接数据库
            SqlCommand sc = new SqlCommand(sql, con);
            //将聚合函数所查询到的数据存入sca，sca是个对象变量
            //是所有数据类型的父类，可以转换为任意类型
            Object sca = sc.ExecuteScalar();
            //关闭数据库的连接
            con.Close();
            //返回所查询到的首行首列的值
            return sca;
        }
    }
}
